/**
 * 业务处理函数 src/api/tool.ts
 *
 */
import axios from 'axios'
import type { InternalAxiosRequestConfig } from 'axios'
import { headersStore } from '@/stores/apiHeader'
import { useUserStore } from '@/stores/user'
import router from '@/router'
// import { ElMessage } from "element-plus"; // message UI 插件导入

// 请求拦截
const handleRequestHeader = (config: InternalAxiosRequestConfig<any>) => {
  // config["xxxx"] = "xxx";
  return config
}
const handleConfigureAuth = (config: any) => {
  const {
    type_id,
    language_id,
    authority_id,
    year,
    month,
    scope_code,
    distributor_key,
    every_code,
    coefficient_addition,
  } = headersStore()
  const { token, userInfo } = useUserStore()
  config.headers['appkey'] = 'bkbkaaaabk' // 调用方分配key
  config.headers['clientid'] = 'BigData' // 设备(b2c,myb2c,BigData,bi...)
  config.headers['languageid	'] = language_id || '' // 语言编码
  config.headers['kmToken'] = token ? 'Bearer ' + token : '' // Token令牌
  config.headers['timestamp'] = new Date().getTime() // 时间戳
  config.headers['username'] = userInfo.kmid || '' // 用户名
  config.headers['typeid'] = type_id || '' // 类型(1:全球业务2:全球财务3:全球供应链4:直销商)
  config.headers['authorityid'] = authority_id || '' // 权限ID
  config.headers['year'] = year || '' //  年份
  config.headers['month'] = month || '00' //  月份(参数值00查询全年)
  config.headers['scopecode'] = scope_code // 国家简码以及区域编码以及城市简码
  config.headers['distributorkey'] = distributor_key // 经销商key ,用于经销商的任何接口的鉴权
  config.headers['everyCode'] = every_code // 区分全球区域对比或国家对比  0各个区域，1 各个国家 默认空
  config.headers['coefficientofaddition'] = coefficient_addition // 加成系数(彩蛋)
  return config
}

// 响应拦截-网络错误处理
const handleNetworkError = (errStatus: any) => {
  let errMessage = '未知错误'
  if (errStatus) {
    switch (errStatus) {
      case 400:
        errMessage = '错误的请求'
        break
      case 401:
        errMessage = '未授权，请重新登录'
        break
      case 403:
        errMessage = '拒绝访问'
        break
      case 404:
        errMessage = '请求错误,未找到该资源'
        break
      case 405:
        errMessage = '请求方法未允许'
        break
      case 408:
        errMessage = '请求超时'
        break
      case 500:
        errMessage = '服务器端出错'
        break
      case 501:
        errMessage = '网络未实现'
        break
      case 502:
        errMessage = '网络错误'
        break
      case 503:
        errMessage = '服务不可用'
        break
      case 504:
        errMessage = '网络超时'
        break
      case 505:
        errMessage = 'http版本不支持该请求'
        break
      default:
        errMessage = `其他连接错误 --${errStatus}`
    }
  } else {
    errMessage = `无法连接到服务器！`
  }

  // ElMessage.error(errMessage);
}

// 响应拦截-授权错误处理 (根据项目自行配置通用 error no code )
const handleAuthError = (errno: string | number) => {
  const authErrMap: any = {
    '40001': '登录失效，需要重新登录', // token 失效
    '40005': '登录失效，需要重新登录', // token 失效
    // "10032": "您太久没登录，请重新登录~", // token 过期
    // "10033": "账户未绑定角色，请联系管理员绑定角色",
    // "10034": "该用户未注册，请联系管理员注册用户",
    // "10035": "code 无法获取对应第三方平台用户",
    // "10036": "该账户未关联员工，请联系管理员做关联",
    // "10037": "账号已无效",
    // "10038": "账号未找到",
  }

  // eslint-disable-next-line no-prototype-builtins
  if (authErrMap.hasOwnProperty(errno)) {
    // 阻止重复弹窗
    const exchangeRateTips = document.getElementsByClassName('globalTip')
    if (exchangeRateTips.length > 0) return
    ElMessage({
      message: authErrMap[errno],
      type: 'error',
      offset: 300,
      showClose: true,
      duration: 1000,
      customClass: 'globalTip',
    })
    // ElMessage.error(authErrMap[errno])
    // 授权错误，登出账户
    router.push('/login') // 跳转到登录页面
    return false
  }
  return true
}

// 响应拦截-普通错误处理
const handleGeneralError = (errno: any, errmsg: any) => {
  const isDev = process.env.NODE_ENV === 'development'
  if (errno != '0' && isDev) {
    // ElMessage.error(errmsg || '未知错误')
    return false
  }
  return true
}

export {
  handleRequestHeader,
  handleConfigureAuth,
  handleNetworkError,
  handleAuthError,
  handleGeneralError,
}
